﻿using Black.Minecraft.Editor.ViewModels.Core;
using Black.NBT;

namespace Black.Minecraft.Editor.ViewModels.DataModels
{
    /// <summary>
    /// ViewModel pour les informations de la partie
    /// </summary>
    public class GameInformationViewModel : BaseViewModel
    {
        #region Propriétés

        /// <summary>
        /// Obtient ou définit si la partie est en hardcore
        /// </summary>
        public ByteBinaryChoiceType AllowCommands
        {
            get
            {
                return ((ByteBinaryChoiceType)((TagByte)this._data["allowCommands"]).Value);
            }
            set
            {
                TagByte item = (TagByte)this._data["allowCommands"];

                if ((ByteBinaryChoiceType)item.Value != value)
                {
                    item.Value = (byte)value;
                    this.OnPropertyChanged();
                    MainViewModel.Instance.IsModified = true;
                }
            }
        }

        /// <summary>
        /// Obtient ou définit le type de partie en mode solo
        /// </summary>
        public SoloGameType GameType
        {
            get
            {
                return ((SoloGameType)((TagInt)this._data["GameType"]).Value);
            }
            set
            {
                SoloGameType item = (SoloGameType)((TagInt)this._data["GameType"]).Value;

                if (item != value)
                {
                    ((TagInt)this._data["GameType"]).Value = (int)value;
                    this.OnPropertyChanged();
                    MainViewModel.Instance.IsModified = true;
                }
            }
        }

        /// <summary>
        /// Obtient ou définit le nom de la carte
        /// </summary>
        public string LevelName
        {
            get
            {
                return (((TagString)this._data["LevelName"]).Value);
            }
            set
            {
                TagString item = (TagString)this._data["LevelName"];

                if (item.Value != value)
                {
                    item.Value = value;
                    this.OnPropertyChanged();
                    MainViewModel.Instance.IsModified = true;
                }
            }
        }

        /// <summary>
        /// Obtient la seed de la carte
        /// </summary>
        public long Seed
        {
            get
            {
                return (((TagLong)this._data["RandomSeed"]).Value);
            }
        }

        /// <summary>
        /// Obtient ou définit si la partie est en hardcore
        /// </summary>
        public ByteBinaryChoiceType IsHardcore
        {
            get
            {
                return ((ByteBinaryChoiceType)((TagByte)this._data["hardcore"]).Value);
            }
            set
            {
                TagByte item = (TagByte)this._data["hardacore"];

                if ((ByteBinaryChoiceType)item.Value != value)
                {
                    item.Value = (byte)value;
                    this.OnPropertyChanged();
                    MainViewModel.Instance.IsModified = true;
                }
            }
        }

        /// <summary>
        /// Obtient ou définit la coordonnée de spawn en X
        /// </summary>
        public int SpawnX
        {
            get
            {
                return (((TagInt)this._data["SpawnX"]).Value);
            }
            set
            {
                TagInt item = (TagInt)this._data["SpawnX"];

                if (item.Value != value)
                {
                    item.Value = value;
                    this.OnPropertyChanged();
                    MainViewModel.Instance.IsModified = true;
                }
            }
        }

        /// <summary>
        /// Obtient ou définit la coordonnée de spawn en Y
        /// </summary>
        public int SpawnY
        {
            get
            {
                return (((TagInt)this._data["SpawnY"]).Value);
            }
            set
            {
                TagInt item = (TagInt)this._data["SpawnY"];

                if (item.Value != value)
                {
                    item.Value = value;
                    this.OnPropertyChanged();
                    MainViewModel.Instance.IsModified = true;
                }
            }
        }

        #endregion

        #region Variables d'instances

        private TagCompound _data;

        #endregion

        #region Constructeurs

        /// <summary>
        /// Constructeur de la classe
        /// </summary>
        /// <param name="data">Source de donnée</param>
        public GameInformationViewModel(TagCompound data)
            : base()
        {
            this._data = data;
        }

        #endregion

        #region Fonctions publiques

        /// <summary>
        /// Retourne la source de donnée
        /// </summary>
        /// <returns>Source de donnée</returns>
        public TagCompound GetData()
        {
            return (this._data);
        }

        #endregion
    }
}
